My code. Again, this is working as is. Still in the "alpha" stages, so there are definitively some formatting/efficiency issues.
/*
*
* Alarm sketch
* Ryan Adams
* 2/4/2012
* Version 0.3.0
*
* TO DO:
* Password protect pages
* Cleanup code
* Power from ethernet headers
*/
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#define zone1Name "Front Door"
#define zone2Name "Patio Door"
#define zone3Name "Bedroom Window"
#define zone4Name "Office Window"
#define zone5Name "Zone 5 - Unused"
#define zone6Name "Zone 6 - Unused"
#define sirenPin 8
#define sirenLength 5000
#define localUdpPort 8888
#define syslogPort 514
// Configure other variables
int previousClosedZoneCount = 0;
int closedZoneCount = 0;
boolean breached = 0;
unsigned long sirenOnTimestamp = 0;
boolean sirenStatus = 0;
boolean armedState = 1;
char line1[100];
EthernetServer server(80);
int zoneStatusArray[6] = {
0, 0, 0, 0, 0, 0};
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 10, 102);
IPAddress syslogServer(192, 168, 10, 101);
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
void setup()
{
Ethernet.begin(mac,ip);
Udp.begin(localUdpPort);
sendSyslogMessage(6, "Syslog logging started");
// Set pullup on zone input pins
pinMode(A0, INPUT);
digitalWrite(A0, HIGH);
pinMode(A1, INPUT);
digitalWrite(A1, HIGH);
pinMode(A2, INPUT);
digitalWrite(A2, HIGH);
pinMode(A3, INPUT);
digitalWrite(A3, HIGH);
pinMode(A4, INPUT);
digitalWrite(A4, HIGH);
pinMode(A5, INPUT);
digitalWrite(A5, HIGH);
pinMode(sirenPin, OUTPUT);
digitalWrite(sirenPin, LOW);
// Start HTTP server
server.begin();
sendSyslogMessage(6, "HTTP server started");
sendSyslogMessage(6, "Boot complete");
}
void loop()
{
// Determine status of each zone. 1 = closed, 0 = open
previousClosedZoneCount = closedZoneCount;
closedZoneCount = 0;
for (int i=0; i <= 5; i++){
if (analogRead(i) < 100){
zoneStatusArray[i] = 1;
closedZoneCount++;
}
else {
zoneStatusArray[i] = 0;
}
}
if (closedZoneCount >= previousClosedZoneCount){
breached = 0;
}
else {
breached = 1;
sendSyslogMessage(6, "A zone has been breached");
}
if ((breached) && (armedState)) {
sirenStatus = 1;
sendSyslogMessage(1, "Siren activated");
digitalWrite(sirenPin, HIGH);
sirenOnTimestamp = millis();
delay(500);
}
else if (((sirenOnTimestamp + sirenLength) > millis()) && (armedState)) {
sirenStatus = 1;
}
else if (sirenStatus) {
sirenStatus = 0;
sendSyslogMessage(2, "Siren deactivated");
digitalWrite(sirenPin, LOW);
sirenOnTimestamp = 0;
}
else {
sirenStatus = 0;
sirenOnTimestamp = 0;
}
// listen for incoming clients
EthernetClient client = server.available();
if (client)
{
while (client.connected())
{
sendSyslogMessage(6, "HTTP client connected");
readHeader(client);
if (! pageNameIs("/"))
{
client.stop();
return;
}
if (valueOfParam('a') == 0){
armedState = 0;
sendSyslogMessage(6, "System disarmed");
}
else if (valueOfParam('a') == 1){
armedState = 1;
sendSyslogMessage(6, "System armed");
}
else {
armedState = armedState;
}
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
// send the body
client.println("<html>");
client.println("<head>");
client.println("<title>");
client.println("Arduino Alarm Interface");
client.println("</title>");
client.println("</head>");
client.println("<body>");
client.print(zone1Name);
client.print(" : ");
client.print(zoneStatusArray[0]);
client.println("
");
client.print(zone2Name);
client.print(" : ");
client.print(zoneStatusArray[1]);
client.println("
");
client.print(zone3Name);
client.print(" : ");
client.print(zoneStatusArray[2]);
client.print("
");
client.print(zone4Name);
client.print(" : ");
client.print(zoneStatusArray[3]);
client.println("
");
client.print(zone5Name);
client.print(" : ");
client.print(zoneStatusArray[4]);
client.println("
");
client.print(zone6Name);
client.print(" : ");
client.print(zoneStatusArray[5]);
client.println("
");
client.print("Siren status : ");
client.print(sirenStatus);
client.println("
");
client.print("Armed state : ");
client.print(armedState);
client.println("
");
client.println("<form method='GET'>");
client.print("Armed: ");
client.print("<select name='");
client.print("a");
client.println("'>");
client.print("<option value='0'");
if (armedState == 0)
{
client.print(" selected");
}
client.println(">Off</option>");
client.print("<option value='1'");
if (armedState == 1)
{
client.print(" selected");
}
client.println(">On</option>");
client.println("</select></p>");
client.println("<input type='submit' value='Update'/>");
client.println("</form>");
client.println("</body></html>");
client.stop();
}
}
}
void readHeader(EthernetClient client)
{
// read first line of header
char ch;
int i = 0;
while (ch != '\n')
{
if (client.available())
{
ch = client.read();
line1[i] = ch;
i ++;
}
}
line1[i] = '\0';
Serial.println(line1);
}
boolean pageNameIs(char* name)
{
// page name starts at char pos 4
// ends with space
int i = 4;
char ch = line1[i];
while (ch != ' ' && ch != '\n' && ch != '?')
{
if (name[i-4] != line1[i])
{
return false;
}
i++;
ch = line1[i];
}
return true;
}
int valueOfParam(char param)
{
for (int i = 0; i < strlen(line1); i++)
{
if (line1[i] == param && line1[i+1] == '=')
{
return (line1[i+2] - '0');
}
}
return 2;
}
void sendSyslogMessage(int severity, String message)
{
/*
0 Emergency: system is unusable
1 Alert: action must be taken immediately
2 Critical: critical conditions
3 Error: error conditions
4 Warning: warning conditions
5 Notice: normal but significant condition
6 Informational: informational messages
Only severity levels 0, 1, and 2 will trigger an email message
*/
int pri = (32 + severity);
String priString = String(pri, DEC);
String buffer = "<" + priString + ">" + "AlarmSystem " + message;
int bufferLength = buffer.length();
char char1[bufferLength+1];
for(int i=0; i<bufferLength; i++)
{
char1[i]=buffer.charAt(i);
}
char1[bufferLength] = '\0';
Udp.beginPacket(syslogServer, syslogPort);
Udp.write(char1);
Udp.endPacket();
}