/* * ZMHW Modector * * Digital High outputs TCP Packet to ZMTrigger * Steak Electronics Company 2019 * * */ /* Same as default library but uses UIPEthernet. Requires UIPEthernet. Manage Libraries - Download UIP Ethernet library */ /* Web Server A simple web server that shows the value of the analog input pins. using an Arduino Wiznet Ethernet shield. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 * Analog inputs attached to pins A0 through A5 (optional) created 18 Dec 2009 by David A. Mellis modified 9 Apr 2012 by Tom Igoe modified 02 Sept 2015 by Arturo Guadalupi */ #include #include #define NORMALMODECT 1 // For a digital High motion sensor. #define TWOSERVERS 1 // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x50 }; IPAddress ip(192, 168, 1, 50); // Initialize the Ethernet server library // with the IP address and port you want to use // (port 80 is default for HTTP): #define LISTENPORT 80 EthernetServer serverHOST(LISTENPORT); //Client byte server[] = { 192, 168, 1, 115 }; //byte serverB[] = { 192, 168, 1, 116 }; //can't be server2, as that is already set for ethernetserver below String host="192.168.1.115"; char* monnum = "32"; //monitor number char* LOCATIONOFSENSOR = "FtLab"; #define ZMTRIGGERPORT 6802 EthernetClient client; //IO #define MODECTPIN 8 //GLOBALS uint8_t AlarmActive = 0; char* ZMTriggerMessage = "1234567890123456789012345"; //Initialize this with dummy data uint8_t TEMPERATUREVALUE = 0; uint8_t TEMPERATUREVALUE2 = 0; uint8_t MODECTVALUE = 0; char* onoff = "on"; //command to send to zmtrigger. char* timealarm = "10"; //time to set monitor to alarm char* score = "77"; //score to assign char* source = "ZMHW";//source. Add details as needed (e.g. Hallway sensor) uint8_t ActivateServer2 = 0; //Interrupt / Timer uint16_t timer1 = 0; uint16_t timer1_counter = 0; uint8_t debouncetime = 0; uint8_t first_interrupt = 0; //for debounce ISR(TIMER1_OVF_vect){ timer1++; if (first_interrupt == 1 ){ debouncetime++; } if (debouncetime > 2) { first_interrupt = 0; debouncetime = 0; AlarmActive = 0; } } void TimerInit(void){ //Crystal of Uno is == Mega (16MHz) //this timer init is flawed, but doesn't matter, as we only //need two or three counts between alarms. TODO: clean up TCCR1A = 0; //Clear existing registers TCCR1B = 0; // Set timer1_counter to the correct value for our interrupt interval //timer1_counter = 10000; // 62500 for one second if using 256 prescaler. can't be over 16 bit value (timer1 is 16bit limited) //timer1_counter = 10; //TCNT1 = timer1_counter; // TCNT1 is what we are overflowing on TCCR1B |= (1 << CS12); // 256 prescaler (divide 16mhz/256 = 62500) TCCR1B |= 00000101; // https://web.archive.org/web/20170707164930/http://www.avrbeginners.net:80/architecture/timers/timers.html // search tccr1b TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt (if goes over timer, interrupt flagged) sei(); //timer needs interrupts, enable (set) interrupts } void ReadModect(void){ if (NORMALMODECT){ delay(10); MODECTVALUE = digitalRead(MODECTPIN); delay(10); //Serial.print(F("Motion Detector Value (normal): ")); //Serial.println(String(MODECTVALUE)); //Serial.println(MODECTVALUE); delay(30); } } void DigiModectChkandSend(void){ //Digital High Motion Sensor if(NORMALMODECT){ if (MODECTVALUE==HIGH && AlarmActive == 0){ Serial.println(F("Motion Detected on Normal Sensor")); //firstpacketsend = 0; cli(); //some of this may be redundant, need to check AlarmActive = 1; first_interrupt = 1; debouncetime = 0; sei(); delay(10); Serial.println(F("Connecting To Cam Srv")); if (client.connect(server, ZMTRIGGERPORT)) { //beware that the buffer in snprintf is big enough to hold everything snprintf(ZMTriggerMessage, 56, "%s|%s+%s|%s|%s||", monnum, onoff, timealarm, score, source); Serial.print(F("the TCP Packet being sent:")); Serial.println(String(ZMTriggerMessage)); client.println(String(ZMTriggerMessage)); //required Serial.println(F("TCP packet sent to ZMTrigger")); client.stop(); if(TWOSERVERS){ ActivateServer2 = 1; } } else { //NOTE: If you are not connected to the network //the device will currently freeze up, and not timeout. //Need to implement a watchdog. //If you ARE connected to the network, and server is not available //then it will timeout. Serial.println(F("Connection to Server failed")); } } } } void SendtoServer2(void){ server[0] = 192; server[1] = 168; server[2] = 1; server[3] = 116; host="192.168.1.116"; delay(10); Serial.println(F("Connecting To Cam Srv")); if (client.connect(server, ZMTRIGGERPORT)) { client.println(String(ZMTriggerMessage)); //required Serial.println(F("TCP packet sent to Server Two ZMTrigger")); client.stop(); } server[0] = 192; server[1] = 168; server[2] = 1; server[3] = 115; host="192.168.1.115"; ActivateServer2 = 0; } void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println(F("ZMHW Project")); Serial.println(F("Motion Sensor")); // start the Ethernet connection and the server: Ethernet.begin(mac, ip); serverHOST.begin(); Serial.print(F("server is at ")); Serial.println(Ethernet.localIP()); pinMode(MODECTPIN, INPUT); TimerInit(); } void loop() { ReadModect(); DigiModectChkandSend(); if(TWOSERVERS && ActivateServer2){ SendtoServer2(); } // listen for incoming clients EthernetClient client = serverHOST.available(); if (client) { Serial.println("new client"); // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) { // send a standard http response header 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(""); client.println("
");
          client.println("Steak Electronics");
          client.println("\"Eat Steak, Use Birth Control\"");
          client.println("");
          client.print("Sensor Location:");
          client.println(LOCATIONOFSENSOR);
          client.print("Type::");
          client.println("HFS-DC06H");
          client.print("Monitor: ");
          client.println(monnum);
          client.print("Temp:");
          client.println(TEMPERATUREVALUE2);
          client.println("
"); 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; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); Serial.println("client disconnected"); } } /* ZMTrigger Command to Send B|B|B|B|B|B which in this code is: monnum | onoff + timealarm | score | source e.g. 2|on+5|100|ZoneAVR|| This will send a command to ZMTrigger.pl to turn monitor #2 ON (alarm state) for five seconds, with a score of 100 and the source of ZoneAVR. The text field, and show text are not setup here. */