// Controllo remoto 05/05/2012 // poichè sono ancora ai primi passi ho usato // a larghe mani idee e listati di altri. Ringrazio tutti loro. // Librerie necessarie per il progetto #include <Wire.h> #include <SHT1x.h> #include <WProgram.h> #include <SPI.h> #include <Ethernet.h> #include "Ultrasonic.h" //creo un array di byte per specificare il mac address byte mac[] = 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED ; //creo un array di byte per specificare l'indirizzo ip byte ip[] = 192, 168, 0, 77; //modificare questo valore in base alla propria rete char Data_RX; String msg = ""; int cmd = 0; //creao un oggetto server che rimane in ascolto sulla porta specificata Server ArduinoServer(80); int inpin = 2; // pulsante connesso al digital pin 2 int val1 = 0; // variabile per morizzare una misura int alarmpin = 5; // uscita allarme su digital pin 5 int val2 = 0; // variable memorizzazione allarme int val3 = 0 ; // variabile per il controllo del refrish // variabili di data/ora int hour; int minute; int second; int month; int day_of_week; int day; int year; // definizione per SHT11 - temperatura interna #define datapin 6 #define clockpin 7 SHT1x sht1x(datapin, clockpin); //pin dedicati al sensore ultrasuoni Ultrasonic ultrasonic(8,9); void setup() //inizializzo la I2C Wire.begin(); delay(300); //inizializza lo shield con il mac e l'ip Ethernet.begin(mac, ip); //inizializza l'oggetto server ArduinoServer.begin(); //definisco il modo di pin3 e altri pinmode(3, OUTPUT); pinmode(inpin, INPUT); pinmode(alarmpin, OUTPUT);
void loop() //IMPORTANTE pulisco la variabile msg e val3 msg = ""; val3 = 0; Client client = ArduinoServer.available(); //controllo se client è true if (client!= false) //controllo continuamente che il client sia connesso while (client.connected()) //Controllo se ci sono byte disponibili per la lettura if (client.available()) //leggo i byte disponibili provenienti dal client Data_RX = client.read(); //ricostruisco la stringa ricevuta concatenando i singoli byte msg += Data_RX; //Attendo che tutti i byte siano letti quando Data_RX contiene il carattere //di nuova linea capisco che tutti i byte sono stati letti if (Data_RX == '\n') //cerco all'interno della stringa il parametro che mi interessa delay(2000); //Invio la risposta al client //invio lo status code client.println("http/1.1 200 OK"); //imposto il data type client.println("content-type: text/html"); client.println(); //invio codice html client.print("<html><body>"); client.print("<head>"); client.print("<meta HTTP-EQUIV='refresh' CONTENT='5; /'>"); //Piloto l'uscita e invio lo stato al browser cmd = msg.indexof("on"); val3 = 1; digitalwrite(3, HIGH);
client.print("<meta HTTP-EQUIV='refresh' CONTENT='0; /'>"); client.print("</head>") ; cmd = msg.indexof("off"); val3= 1; digitalwrite(3, LOW); client.print("<meta HTTP-EQUIV='refresh' CONTENT='0; /'>"); cmd = msg.indexof("blk"); val3 = 1; digitalwrite(3, HIGH); client.print("<meta HTTP-EQUIV='refresh' CONTENT='5; /'>"); delay(6000); // ritardo n-sec per eventuale avvio utilizzi esterni digitalwrite(3, LOW); //funziona su chiamata diretta ma vorrei usarlo per refresh elenco dati su mio sit client.print("<meta HTTP-EQUIV='refresh' CONTENT='5; /'>"); client.print("</head>") ; cmd = msg.indexof("dati"); if (val3=1) cmd=1; // Circuito data-ora I2C metto il registro indirizzi a 0. Wire.beginTransmission(104); // trasmetto al device #104, il DS1307 Wire.send(0x00); Wire.endTransmission(); // fine trasmissione Wire.requestFrom(104, 7); // richiesta di 7 byte da slave DS1307
// determino l'appartenenza del byte second = Wire.receive(); minute = Wire.receive(); hour = Wire.receive(); day_of_week=wire.receive(); day = Wire.receive(); month = Wire.receive(); year = Wire.receive(); // Conversione di tutti i valori in decimale hour=hour/16 * 10 + hour % 16; minute=minute/16 * 10 + minute % 16; second=second/16 * 10 + second % 16; day=day/16 * 10 + day % 16; month=month/16 * 10 + month % 16; year=2000 + year/16 * 10 + year % 16; delay(500); client.print("scheda Arduino2009 + scheda Ethernet "); client.print("test real time on line -- Ciao, Arrigo "); // scrittura data if (day < 10) client.print("0"); client.print(day); client.print("/"); if (month < 10) client.print("0"); client.print(month); client.print("/"); client.print(year); client.print(" ---- "); // scrittura ora if (hour < 10) client.print("0"); client.print(hour); client.print(":"); if (minute < 10) client.print("0"); client.print(minute); client.print(":"); if (second < 10) client.print("0"); client.print(second); delay(300); // trasmette il valore di ciascun ingresso analogico for (int analogchannel = 0; analogchannel < 4; analogchannel++) client.print("analog input ");
client.print(analogchannel); client.print(" is "); client.print(analogread(analogchannel)); val1 = digitalread(3); // read the input pin client.print(" Relay_1 "); if (val1 > 0)client.print(" ON "); if (val1 < 1)client.print(" OFF "); // controlla lo stato del sensore ultrasuoni delay(200); val2=ultrasonic.ranging(cm); if (val2<70) digitalwrite(alarmpin, HIGH); //eccita il relè client.print(" Area libera cm "); client.print(val2); client.print(" -->>> ALLARME "); // trasmette l'allarme delay(2000); else digitalwrite(alarmpin, LOW); // relè diseccitato client.print(" cm "); client.print(val2); client.print(" -->> TUTTO OK "); // trasmette OK //legge Temperatura e Umidità del sensore SHT11 float temp_c; int humidity; temp_c = sht1x.readtemperaturec(); humidity = sht1x.readhumidity(); delay(300); client.print(" Temperatura interna "); client.print((temp_c-2),1); client.print(" gradic"); client.print(" Umidita' interna "); client.print(humidity); //Umidità client.print("% ");
client.print("</body></html>"); //aspetto 4 ms affinchè la risposta giunga al browser del client delay(4); //esco dal ciclo while una volta completato l'invio della risposta break; //chiudo la connessione client.stop();