As told last week I want to comment the code.
For convenience I copy it again:
/* Ricezione dai sensori porte Trasmissione verso telecamera rivelazione rumore http://code.google.com/p/rc-switch/ Need help? http://forum.ardumote.com */ #include <String.h> #include <RCSwitch.h> #include <Time.h> #include <SPI.h> #include <Ethernet.h> /* Informazioni Ethernet*/ byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; int SERIAL_BAUD = 9600; int TRASMIT_PIN = 9; int RECEIVE_PIN = 0; int NOISE_DIGITAL_PIN = 5; //Sensori long PORTA_INGRESSO_SENSORE = 3557625; long PORTA_CUCINA_SENSORE = 10521177; long SEGNALE_ACCENZIONE_WEBCAM = 1394001; long SEGNALE_SPEGNIMENTO_WEBCAM= 1394004; EthernetClient client; EthernetServer server(8081); char smtpServer[] = "smtpcorp.com"; RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(SERIAL_BAUD); pinMode(SERIAL_BAUD, INPUT); mySwitch.enableReceive(RECEIVE_PIN); mySwitch.enableTransmit(TRASMIT_PIN); setupComm(); } void loop() { getClientConnection(); if (detectNoise()){ Serial.print("Rumore"); email("Waring, noise in the house!"); accendiCam(SEGNALE_ACCENZIONE_WEBCAM) ; } if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); Serial.print(value); if (value == 0) { Serial.print("Unknown encoding"); Serial.print("n"); } else { long receivedValue = mySwitch.getReceivedValue(); if (receivedValue == PORTA_INGRESSO_SENSORE) { Serial.print("Warning! Door open!"); Serial.print("n"); email("Warning, Door open!"); accendiCam(SEGNALE_ACCENZIONE_WEBCAM) ; delay(1000); } else if(receivedValue == PORTA_CUCINA_SENSORE) { Serial.print("Warning! Porta cucina aperta!"); Serial.print("n"); email("Attenzione, porta cucina aperta!"); accendiCam(SEGNALE_ACCENZIONE_WEBCAM) ; delay(1000); } Serial.print("Received "); Serial.print( receivedValue); Serial.print(" / "); Serial.print( mySwitch.getReceivedBitlength() ); Serial.print("bit "); Serial.print("Protocol: "); Serial.println( mySwitch.getReceivedProtocol() ); } mySwitch.resetAvailable(); } } bool detectNoise () { bool rit = false; if (digitalRead(NOISE_DIGITAL_PIN) == HIGH) { rit = true; } return rit; } void accendiCam(long value) { mySwitch.send(value, 24); mySwitch.send(value, 24); mySwitch.send(value, 24); mySwitch.send(value, 24); mySwitch.send(value, 24); } void setupComm() { Serial.println("Trying to connect"); Serial.print("n"); if (!Ethernet.begin(mac)){ Serial.println("Failed to DHCP"); while(true); } Serial.print("My IP address: "); for (byte thisByte = 0; thisByte < 4; thisByte++) { Serial.print(Ethernet.localIP()[thisByte], DEC); Serial.print("."); } Serial.println("fine"); } // Call to send an email. bool email(char* text) { bool success = false; Serial.println("Sending email..."); Serial.print("n"); Serial.println("SMTP server..."); Serial.print(smtpServer); if (client.connect(smtpServer, 2525)){ Serial.println("connected"); delay(100); client.println("EHLO arduino"); for(int i=0; i<999; ++i){ if(client.read() > 0) break; } Serial.println("responded"); Serial.print("n"); client.println("AUTH LOGIN"); client.println("xxxxxxx"); //vedi precedente post per la spiegazione client.println("yyyyyy"); //vedi precedenti post per la spiegazione client.println("MAIL FROM:<dumm@gmail.com>"); for(int i=0; i<999; ++i){ if(client.read() > 0) break; } client.println("RCPT TO:<giuseppe.scola@gmail.com>"); for(int i=0; i<999; ++i){ if(client.read() > 0) break; } client.println("DATA"); for(int i=0; i<999; ++i){ if(client.read() > 0) break; } client.println("from: giuseppe.scola@gmail.com"); client.println("to: giuseppe.scola@gmail.com"); client.println("SUBJECT: ArduAlarm"); client.println(""); client.println(text); client.println("."); client.println("QUIT"); for(int i=0; i<999; ++i){ if(i > 998){ Serial.println("error: No response"); } if(client.read() > 0) break; } success = true; client.println(); Serial.println("end"); Serial.print("n"); } else { Serial.println("Failed"); Serial.print("n"); client.println("QUIT"); } client.stop(); return success; } void getClientConnection(){ EthernetClient client = server.available(); if (client) { String postString =""; Serial.println("nuova richiesta"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); //postString.concat(c); if(postString.length()<10){ postString +=c; } // Serial.write(c); if (c == 'n' && currentLineIsBlank) { //if(readString.indexOf("id=1") > 0){ client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response //client.println("Refresh: 5"); // refresh the page automatically every 5 sec client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); //client.println("<h1>Settaggi</h1><br>"); client.println("<h1>AllarDuino</h1>"); client.print("<br>"); client.println("<a href="./?on">Accendi CAM</a>"); client.println("<a href="./?off">Spegni CAM</a>"); client.println("</html>"); break; //} } if (c == 'n') { // you're starting a new line currentLineIsBlank = true; } else if (c != 'r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } //fine client.connected Serial.println("-------------"); Serial.println(postString); Serial.println("-------------"); if(postString.indexOf("?on") > 0){ Serial.println("accendi CAM"); accendiCam(SEGNALE_ACCENZIONE_WEBCAM); client.println("<br/>"); client.println("<p>Cam accesa</p>"); } if(postString.indexOf("?off") > 0){ accendiCam(SEGNALE_SPEGNIMENTO_WEBCAM); client.println("<br/>"); client.println("<p>Cam spenta</p>"); } delay(1); // close the connection: client.stop(); Serial.println("client disonnected"); } }
The “new” code is to power on/off the webcam from a client/browser.
This new feature allows you to manage calls coming from browser to Arduino, acting as a server.
In our case Arduino will listen incoming request at 8081 port as specified at line 32 EthernetServer server(8081);
At line 116 I start the server with setupComm function (I set MAC code in the begin function).
In the loop funcion I call getClientConnection:
- line 201: Checking if a client is sending a new request to the Arduino server.
- line 202: if a request is incoming…
- line 207: if client is reacheble….
- line 298->231: I read the data sent from the client until I reach the end line (\n) and line empty: now I know I received all the datas from the client and the server (Arduino) can send the answer. Arduino send HTTP/1.1 200 OK status, all is ok! and an html page like the image :
(I know..it’s an ugly page…)
Pressing Accendi Cam (Power on Cam) I call server with the ?on paramenter in the query string while pressing Spegni Cam (Power off Cam) I call the server with ?off paramenter. - line 249 and line 256: I check which of the two parameters was sent to server and I act accordingly: I turn on or off the cam.
- I finally close the connection
Well…I hope I was clear, let me know please…
I’d like to have feedbacks and comments!
The next step is to write code more customize.
I want to save the sensor code in the EEPROM and read when I need.
I have to study Arduino memory!
Have a good day!