/* homecontrol - v1.0 Arduino Sketch für homecontrol Copyright (c) 2013 Daniel Scheidler All right reserved. homecontrol ist Freie Software: Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation, Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren veröffentlichten Version, weiterverbreiten und/oder modifizieren. homecontrol wird in der Hoffnung, dass es nützlich sein wird, aber OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU General Public License für weitere Details. Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Wenn nicht, siehe . */ #include #include #include #define c 3830 // 261 Hz #define d 3400 // 294 Hz #define e 3038 // 329 Hz #define f 2864 // 349 Hz #define g 2550 // 392 Hz #define a 2272 // 440 Hz #define b 2028 // 493 Hz #define C 1912 // 523 Hz #define R 0 // Speaker is connected to Arduino Pin #2 #define SIREN_PIN 2 // Variablen für Netzwerkdienste EthernetServer HttpServer(80); EthernetClient interfaceClient; // Variablen für Webseiten/Parameter char* rawCmdAnschluss = (char*)malloc(sizeof(char)*20); const int MAX_BUFFER_LEN = 80; // max characters in page name/parameter char buffer[MAX_BUFFER_LEN+1]; // additional character for terminating null #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif const __FlashStringHelper * htmlHeader; const __FlashStringHelper * htmlHead; const __FlashStringHelper * htmlFooter; int sireneStatus = 0; // ------------------ Reset stuff -------------------------- void(* resetFunc) (void) = 0; unsigned long resetMillis; boolean resetSytem = false; // --------------- END - Reset stuff ----------------------- int melody[] = { C, b, g, C, b, e, R, C, c, g, a, C }; int beats[] = { 16, 16, 16, 8, 8, 16, 32, 16, 16, 16, 8, 8 }; int MAX_COUNT = sizeof(melody) / 2; // Melody length, for looping. // Set overall tempo long tempo = 10000; // Set length of pause between notes int pause = 1000; // Loop variable to increase Rest length int rest_count = 100; //<-BLETCHEROUS HACK; See NOTES // Initialize core variables int tone_ = 0; int beat = 0; long duration = 0; /** * SETUP * * Grundeinrichtung der HomeControl * - Serielle Ausgabe aktivieren * - TFT initialisieren * - Netzwerk initialisieren * - Webserver starten * - IN-/OUT- Pins definieren * - Waage initialisieren (Tara) */ void setup() { unsigned char mac[] = {0xAE, 0xBD, 0xCE, 0xDF, 0xEE, 0xED }; unsigned char ip[] = { 192, 168, 1, 161 }; unsigned char dns[] = { 192, 168, 1, 1 }; unsigned char gate[] = { 192, 168, 1, 1 }; unsigned char mask[] = { 255, 255, 255, 0 }; // Serial initialisieren Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println(F("HomeControl Alarmgeber")); Serial.println(); pinMode(SIREN_PIN, OUTPUT); // Netzwerk initialisieren Ethernet.begin(mac, ip, dns, gate, mask); HttpServer.begin(); Serial.print( F("IP: ") ); Serial.println(Ethernet.localIP()); initStrings(); } void playTone() { long elapsed_time = 0; if (tone_ > 0) { // if this isn't a Rest beat, while the tone has // played less long than 'duration', pulse speaker HIGH and LOW while (elapsed_time < duration) { digitalWrite(SIREN_PIN, HIGH); delayMicroseconds(tone_ / 2); // DOWN digitalWrite(SIREN_PIN, LOW); delayMicroseconds(tone_ / 2); // Keep track of how long we pulsed elapsed_time += (tone_); } } else { // Rest beat; loop times delay for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count delayMicroseconds(duration); } } } /** * LOOP * * Standard-Loop-Methode des Arduino Sketch * Diese Methode wird nach dem Setup endlos wiederholt. * * - Webserver: * * auf Client warten * * Falls Client verbunden ist entsprechende Webseite ausgeben * und Verbindung beenden. */ void loop() { if(sireneStatus>0){ doSiren(); } EthernetClient client = HttpServer.available(); if (client) { while (client.connected()) { if(client.available()){ Serial.println(F("Website anzeigen")); showWebsite(client); Serial.print(F("> Freier Speicher: ")); Serial.println(freeMemory()); delay(100); client.stop(); } } } delay(100); // Gecachte URL-Parameter leeren memset(rawCmdAnschluss,0, sizeof(rawCmdAnschluss)); } void doSiren(){ for (int i=0; iNavigation
" "Manuelle Schaltung
")); showFooter(client); } /** * rawCmd anzeigen */ void runRawCmdWebpage(EthernetClient client, char* HttpFrame){ showHead(client); if (atoi(rawCmdAnschluss)!=0 ) { postRawCmd(client, rawCmdAnschluss); return; } client.println(F( "

Manuelle Schaltung


" "


")); client.print(F( "


")); client.println(F( "")); showFooter(client); } void postRawCmd(EthernetClient client, char* anschluss){ client.println(F( "

Alarmgeber schalten


" )); sireneStatus = atoi(anschluss); } // --------------------------------------- // HTML-Hilfsmethoden // --------------------------------------- void showHead(EthernetClient client){ client.println(htmlHeader); client.print("IP: "); client.println(Ethernet.localIP()); client.println(htmlHead); } void showFooter(EthernetClient client){ client.println(F("
")); client.print(F("Freier Speicher: ")); client.println(freeMemory()); client.println(F("
")); client.print(htmlFooter); } void initStrings(){ htmlHeader = F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"); htmlHead = F("" "HomeControl Alarmgeber" "" "" "
" "

HomeControl Alarmgeber


") ; htmlFooter = F( "
" "Zurueck zum Hauptmenue;" ""); } // --------------------------------------- // Ethernet - Hilfsmethoden // --------------------------------------- /** * Zum auswerten der URL des übergebenen Clients * (implementiert um angeforderte URL am lokalen Webserver zu parsen) */ char* readFromClient(EthernetClient client){ char paramName[20]; char paramValue[20]; char pageName[20]; if (client) { while (client.connected()) { if (client.available()) { memset(buffer,0, sizeof(buffer)); // clear the buffer client.find("/"); if(byte bytesReceived = client.readBytesUntil(' ', buffer, sizeof(buffer))){ buffer[bytesReceived] = '\0'; Serial.print(F("URL: ")); Serial.println(buffer); if(strcmp(buffer, "favicon.ico\0")){ char* paramsTmp = strtok(buffer, " ?=&/\r\n"); int cnt = 0; while (paramsTmp) { switch (cnt) { case 0: strcpy(pageName, paramsTmp); Serial.print(F("Domain: ")); Serial.println(buffer); break; case 1: strcpy(paramName, paramsTmp); Serial.print(F("Parameter: ")); Serial.print(paramName); break; case 2: strcpy(paramValue, paramsTmp); Serial.print(F(" = ")); Serial.println(paramValue); pruefeURLParameter(paramName, paramValue); break; } paramsTmp = strtok(NULL, " ?=&/\r\n"); cnt=cnt==0?1:cnt==1?2:1; } } } }// end if Client available break; }// end while Client connected } return buffer; } void pruefeURLParameter(char* tmpName, char* value){ if(strcmp(tmpName, "schalte")==0 && strcmp(value, "")!=0){ strcpy(rawCmdAnschluss, value); Serial.print(F("OK Anschluss: ")); Serial.println(rawCmdAnschluss); } } // --------------------------------------- // Allgemeine Hilfsmethoden // --------------------------------------- char* int2bin(unsigned int x) { static char buffer[6]; for (int i=0; i<5; i++) buffer[4-i] = '0' + ((x & (1 << i)) > 0); buffer[68] ='\0'; return buffer; }