Buzzer smette di suonare

Salve, avrei un problema con il mio webserver. Ho collegato un contatto reed e un buzzer ad arduino. Quando allontano la calamita dal reed, il buzzer suona… e fin qui tutto bene. Purtroppo quando aggiorno la pagina web o cambio pagina, il buzzer smette di suonare per tutto il caricamento della pagina, per poi riprendere. Io vorrei che suoni senza interruzioni. Come posso risolvere? Vi lascio il codice:

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

#define sdChipset 4
#define ethernetChipset 10

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 55 };
EthernetServer server(80);
File file;
String message;
int len;
String filenames[12];
bool onetime = true;
const char* page;

int reedPin = 22;
int buzzerPin = 23;
int reed;
int antifurto = 0;

void setup() {
  pinMode(reedPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(sdChipset, OUTPUT);
  pinMode(ethernetChipset, OUTPUT);
  digitalWrite(sdChipset, HIGH);
  digitalWrite(ethernetChipset, HIGH);

  if (!SD.begin(sdChipset)) return;

  Ethernet.begin(mac, ip);
  server.begin();
}

void loop() {
  reed = digitalRead(reedPin);

  if (reed == 1  && antifurto == 1) {
    tone(buzzerPin, 3000, 300);
  } else {
    noTone(buzzerPin);
  }

  if (onetime) {
    int k = 0;
    File root = SD.open("/");

    while (true) {
      file = root.openNextFile();
      if (!file) break;
      len = strlen(file.name());

      for (int i=0; i<len; i++) {
        file.name()[i] = tolower(file.name()[i]);
      }

      filenames[k] = file.name();
      file.close();
      k++;
    }

    len = sizeof(filenames)/sizeof(filenames[0]);
    onetime = false;
  }

  EthernetClient client = server.available();

  if (client) {
    boolean blank = true;

    while (client.connected()) {
      if (client.available()) {
        char characters = client.read();

        if (message.length() < 100) {
          message += characters;
        }

        if (characters == '\n' && blank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();

          file = SD.open("header.htm");

          if (file) {
            while (file.available()) {
              client.write(file.read());
            }

            file.close();
          }

          if (message.indexOf("/ ") > 0) {
            file = SD.open("index.htm");
          } else {
            for (int i=0; i<len; i++) {
              if (message.indexOf(filenames[i]) > 0) {
                page = filenames[i].c_str();
                file = SD.open(page);
              }
            }
          }

          if (file) {
            while (file.available()) {
              client.write(file.read());
            }

            if (message.indexOf("ingresso.htm") > 0) {
              if(antifurto == 0) {
                client.println("<a class=\"button on\" href=\"?on\">Attiva</a>");
              } else {
                client.println("<a class=\"button off\" href=\"?off\">Disattiva</a><");
              }

              if (antifurto == 1) {
                if(reed == 1) {
                  client.println("Intrusione Rilevata!");
                } else {
                  client.println("Nessuna Intrusione!");
                }
              }

              if (message.indexOf("?on") > 0) {
                antifurto = 1;
                client.println("Antifurto Attivato!");
              } else if (message.indexOf("?off") > 0) {
                antifurto = 0;
                client.println("Antifurto Disattivato!");
              }
            }

            file.close();
          }

          file = SD.open("footer.htm");

          if (file) {
            while (file.available()) {
              client.write(file.read());
            }

            file.close();
          }

          break;
        }

        if (characters == '\n') {
          blank = true;
        } else if (characters != '\r') {
          blank = false;
        }
      }
    }

    delay(1);
    client.stop();

    message = "";
  }

Grazie per l’aiuto!

Purtroppo non puoi farci nulla.
Il tone viene generato con delle frequenze di microsecondi durante il loop() se esso è impegnato a fare dell'altro e ovvio che non può generare le frequenze (non è un livello H/L permanente).
Potresti ovviare con una cicalina e un piccolo circuito esterno, questa suoneria sarebbe pilotata da un pin in hight, avresti comunque in questo caso un ritardo allo spegnimento, se la cicalina suona e avvicini il magnete mentre il micro legge la sd o dialoga col client non si spegne finchè non ha finito.
Montare una ethernet shield con SD e usarle su un micro 16Mhz è come trasportare un elefante sul tetto di un auto utilitaria, va lo stesso, ma le prestazioni generali lasciano a desiderare.

Cavolo... purtroppo non penso di arrivarci con i tempi se cambio metodo.
Vedrò di inventermi qualcosa... Grazie mille :slight_smile:

Montare una ethernet shield con SD e usarle su un micro 16Mhz è come trasportare un elefante sul tetto di un auto utilitaria, va lo stesso, ma le prestazioni generali lasciano a desiderare

Questa m'e' piacuta
Mi ha ricordato un'episodio successo tanti anni fa' , quando andammo al mare, in 4, su una 500, e con i bagagli per 15gg

ahahahhahahahaha noi sulla 126 in 4 andammo in campeggio da Genova ad Aosta ..... un viaggio da non ripetere :slight_smile: ma bello perchè andava bene tutto pur di "evadere" :slight_smile: :slight_smile:
Peccato che macchine così scomode non ne facciano più, c'era da divertirsi e farsi delle panciate di paura !!!!
ciao

Rieccomi :P. Per risolvere il problema avrei bisogno che, quando il reed passa da high a low o viceversa, prima che il buzzer inizi a suonare o che smetta, la pagina venga refreshata. Ma come è possibile fare una cosa del genere?

Scusa ma è poco chiaro
come fa arduino a sapere che si stanno avvicinando o allontanando i contatti?

Per risolvere il problema avrei bisogno che, quando il reed passa da high a low o viceversa, prima che il buzzer smetta di suonare

prima che il buzzer smetta di suonare
se sta suonando avrai di nuovo un interruzione del suono mentre fa il refresh.
Non lo risolvi è il micro che genera il suono e nel momento in cui lo fa non deve essere interrotto per nessun motivo.

Ti ripeto, ci sono microcicaline che costano pochi centesimi che lavorano con segnali high e low permanenti.

Se proprio vuoi che sia il micro a generare il suono senza componenti esterni già pronti perchè usare un suono continuo? crea un suono intermittente bip-bip * pausa * bip-bip * pausa oppure un biiiiiiiiiiiiiiiiip pausa * biiiiiiiiiiiiiiiiip pausa ................... nelle pause fai fare al micro dell'altro e non noterai la differenza avendo comunque un allarme sonoro.

Scusa, provo a spiegarmi meglio… eliminiamo il buzzer per il momento. Io vorrei una pagina che stampi “Intrusione” quando il magnete è lontano dal reed e “Nessuna intrusione” nel caso contrario e fin qui nessun problema, basta un digitalread. Ovviamente la scritta non cambia se la pagina non si aggiorna, ma posso farlo solo manualmente. Riesco anche a stampare con Serial.print il momento in cui lo stato del reed cambia da 0 a 1 o viceversa. Non è possibile fare in modo che quando avviene questo cambiamento, arduino carichi nuovamente la stessa pagina?

P.S. mentre il buzzer suona io non ho la necessità di cambiare pagina, mi servirebbe solo che quando il reed smette di suonare, la pagina si aggiorni da sola in modo da mostrare la stessa pagina ma con “Nessuna intrusione” invece di “Intrusione”.

Probabilmente non è fattibile, ma visto le mie scarse conoscenze chiedo lo stesso!

P.P.S. In teoria il mio buzzer non fa un suno continuo, fa bip-pausa-bip… ma la pausa che fa il micro quando aggiorno la pagina, è abbastanza più lunga. Comunque, se proprio non c’è altra soluzione, oltre le cicaline, prolungo la pausa tra un bip e l’altro.

ok +/- ho capito cosa intendi ... forse :slight_smile:
è per un esame di maturità che fai questo?

devo montare un altra scheda arduino per testare il tuo sketch ... 1 minuto

Non testo niente, manca il tuo index htm :smiley: :smiley: :smiley:

L’html è diviso in due parti, 1 per l’header:

<!DOCTYPE html>

<html>

<head>
<title>DOMOTICA</title>
<style>
body {
	background-color: #E7ECEF;
	font-family: Georgia, "Times New Roman", Times, serif;
	font-weight: 300;
	font-size: 15px;
	margin: 0 auto;
	margin-top: -9px;
	height: 100%;
}

nav {
	text-align: center;
	background-color: #FFFFFF;
	border: 2px solid #DDE2E5;
	box-shadow: 0 2px 2px -1px rgba(0, 0, 0, 0.055);
	display: block;
	margin: 0 auto;
	margin-top: 8px;
	overflow: hidden;
	width: 760px;
}

nav ul {
	margin: 0;
	padding: 0;
}

nav ul li {
	display: inline-block;
	list-style-type: none;
	-webkit-transition: all 0.2s;
	-moz-transition: all 0.2s;
	-ms-transition: all 0.2s;
	-o-transition: all 0.2s;
	transition: all 0.2s; 
}

nav > ul > li > a {
	font-size: 18px;
	text-shadow: 2px 2px 3px #6D8EC3;
        color: #6D8EC3;
        display: block;
        line-height: 70px;
        padding: 0 16px;
        text-decoration: none;
}

nav > ul > li:hover {
	background-color: rgb( 40, 44, 47 );
}

nav > ul > li:hover > a {
	color: rgb( 255, 255, 255 );
}
      
nav > ul > li > div, nav > ul > li > div ul > li > div {
	background-color: rgb( 40, 44, 47 );
	border-top: 0;
	border-radius: 0 0 4px 4px;
	box-shadow: 0 2px 2px -1px rgba(0, 0, 0, 0.055);
	display: none;
	margin: 0;
	opacity: 0;
	position: absolute;
	width: 140px;
	visibility: hidden;
	-webkit-transiton: opacity 0.2s;
	-moz-transition: opacity 0.2s;
	-ms-transition: opacity 0.2s;
	-o-transition: opacity 0.2s;
	-transition: opacity 0.2s;
}
	  
nav > ul > li > div ul > li > div {
	background-color: rgb( 40, 44, 47 );
	border-radius: 0 4px 4px 4px;
	box-shadow: inset 2px 0 5px rgba(0,0,0,.15);
	margin-top: -42px;
	right: -165px;
}

nav > ul > li:hover > div, nav > ul > li > div ul > li:hover > div {
	display: block;
	opacity: 1;
	visibility: visible;
}

nav > ul > li > div ul > li,  nav > ul > li > div ul > li > div ul > li {
	display: block;
	position: relative;
}

nav > ul > li > div ul > li > a, nav > ul > li > div ul > li > div ul > li > a {
	color: #fff;
	display: block;
	padding: 8px 24px;
	text-decoration: none;
}

nav > ul > li > div ul > li:hover > a {
	background-color: rgba( 255, 255, 255, 0.1);
}

.content {
	border: 2px solid #DDE2E5;
	width: 760px;
	height: 400px;
	text-align: center;
	margin: 0 auto;
	background-color: #FFFFFF;
	overflow: auto;
	font-size: 20px;
	color: #6D8EC3;
	font-weight: bold;
}

hr {
	margin: 0 auto;
	padding: 0;
	color: #E7ECEF;
	width: 760px;
	border: 0;
	height: 6px;
}

.index {
	margin-top: 35px;
	text-shadow: 2px 2px 3px black;
	font-size: 40px;
	color: #FF0000;
}

.index p {
	font-size: 32px;
	text-shadow: 1px 1px 2px black;
}

.title {
	background-color: #F0F8FF;
	border-bottom: 1px solid #DDE2E5;
	width: 100%;
	font-size: 28px;
	font-weight: bold;
	color: #1e90ff;
	text-shadow: 1px 1px 2px black;
	margin: 0 auto;
	padding-bottom: 10px;
	margin-bottom: 20px;
	padding-top: 10px;
}

table {
	width: 100%;
}

td {
	width: 50%;
	padding: 10px;
}

.button {
	-moz-box-shadow:inset 0px 1px 0px 0px #d197fe;
	-webkit-box-shadow:inset 0px 1px 0px 0px #d197fe;
	box-shadow:inset 0px 1px 0px 0px #d197fe;
	-webkit-border-top-left-radius:6px;
	-moz-border-radius-topleft:6px;
	border-top-left-radius:6px;
	-webkit-border-top-right-radius:6px;
	-moz-border-radius-topright:6px;
	border-top-right-radius:6px;
	-webkit-border-bottom-right-radius:6px;
	-moz-border-radius-bottomright:6px;
	border-bottom-right-radius:6px;
	-webkit-border-bottom-left-radius:6px;
	-moz-border-radius-bottomleft:6px;
	border-bottom-left-radius:6px;
	text-indent:0;
	border:1px solid #6AA121;
	display:inline-block;
	color:#ffffff;
	font-family:Arial;
	font-size:15px;
	font-weight:bold;
	font-style:normal;
	height:50px;
	line-height:50px;
	width:100px;
	text-decoration:none;
	text-align:center;
	text-shadow:1px 1px 0px #7d15cd;
}

.button:active {
	position:relative;
	top:1px;
}


.on {
	background:-moz-linear-gradient( center top, #6AA121 5%, #347235 100% );
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#6AA121', endColorstr='#347235');
	background-color:#6AA121;
}

.on:hover {
	background:-moz-linear-gradient( center top, #347235 5%, #6AA121 100% );
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#347235', endColorstr='#6AA121');
	background-color:#347235;
}

.off {
	background:-moz-linear-gradient( center top, #C11B17 5%, #9F000F 100% );
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#C11B17', endColorstr='#9F000F');
	background-color:#C11B17;
}

.off:hover {
	background:-moz-linear-gradient( center top, #9F000F 5%, #C11B17 100% );
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9F000F', endColorstr='#C11B17');
	background-color:#9F000F;
}
</style>
</head>
<body>
<nav>
<ul>

	<li><a href="index.htm">Home</a></li>

	<li><a href="ingresso.htm">Ingresso</a></li>

	<li><a href="cucina.htm">Cucina-Soggiorno</a></li>

	<li><a href="camera.htm">Camera da Letto</a></li>

	<li><a href="garage.htm">Garage</a></li>

	<li><a href="esterno.htm">Esterno</a></li>

</ul>
</nav>
<hr>
<div class="content">

Mentre questa è la pagina dove appare il tasto per attivare/disattivare l’antifurto (ingresso.htm, mentre le varie scritte sono all’interno del codice di arduino:

	<div class="title">INGRESSO</div>
	<table>
		<tr>
			<td>Controllo Luci</td>
			<td>Controllo Antifurto</td>
		</tr>
		<tr>

Ti riposto il codice di arduino, perchè nel primo post avevo tolto tutto quello che non serviva (è troppo lungo quindi ho dovuto hostarlo):

http://www.phpscripts.altervista.org/progetto.ino

E’ un bel po’ incasinato il codice, quindi se è troppo complicato/errato lascia pure perdere :smiley:

comunque riguardo alla tua domanda

Ovviamente la scritta non cambia se la pagina non si aggiorna, ma posso farlo solo manualmente. Riesco anche a stampare con Serial.print il momento in cui lo stato del reed cambia da 0 a 1 o viceversa. Non è possibile fare in modo che quando avviene questo cambiamento, arduino carichi nuovamente la stessa pagina?

si è possibile, ora io non so cosa hai nell’index.htm, il principio di funzionamento è questo:

hai impostato arduino come server, questo significa che esso è in stand-by fino a quando un client non si connette e chiede informazioni al server, non è mai il server a inviare dati di sua spontanea volontà, in questo tipo di protocollo server-client il server nella risposta inserisce i dati richiesti dal client

Quindi è la tua pagina htm che deve chiedere i dati ogni tot tempo, in “parole povere” arduino impostato come server non potrà mai iniziare una negoziazione col tuo browser al cambiamento di stato di un pin

Infatti inizialmente avevo messo un refresh automatico ogni 5 sec... però non è bello vedere la pagina aggiornarsi continuamente. Diverso è il discorso se si aggiorna solo quando il magnete si allontana.

In pratica vorrei che arduino facesse una cosa del genere... memorizza la richiesta del client, e se il magnete si allontana, riesegue la richiesta memorizzata. Probabilmente non è fattibile una cosa del genere.

In pratica vorrei che arduino facesse una cosa del genere… memorizza la richiesta del client, e se il magnete si allontana, riesegue la richiesta memorizzata. Probabilmente non è fattibile una cosa del genere.

no, come l’hai detta tu non può essere eseguita, perchè la richiesta scade immediatamente non può essere memorizzata, non puoi chiedere al client aspetta 2-3 minuti che poi ti rispondo quando succede qualcosa :slight_smile:

Allora la vedo dura:P. Mi sa che le uniche due soluzioni sono cicalino o aumentare la pausa

ma ti resta sempre il problema che a video non vedi i cambiamenti se non con autorefresh manuale o automatico, non è tutto perduto io ti suggerisco con dispiacere di rivedere tutto il sistema server-client. Non sei obbligato a ricaricaricare l’intera pagina ogni volta che fai refresh (che come hai detto è brutto da vedersi e fa perdere tempo al micro), puoi con un certo tipo di lavoro sul client (html-javascript-json o ajax) chiedere solo i dati senza ricaricare tutto, la pagina web viene caricata solo alla prima connessione.

Ok, grazie mille... inizio subito a fare qualche prova :smiley:

Guarda ti aiuto perchè sei un utente che cerca di capire e arrangirasi, non come altri che pretendono e manco ti rispondono, sei disposto a resettare il tuo sketch e ricominciarlo da capo? (almeno per quello che riguarda la parte web) :fearful: :fearful: :fearful:

questi elementi non li possiedo quindi dovrai reinserirli tu

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

Si, io sarei disposto... ho avuto un po' di complicazioni con la parte web perchè ho cercato di fargli leggere tutti i file che avevo all'interno della sd e farglieli aprire da solo e questo mi ha un po' incasinato XD