Monday, May 25, 2015

Home Water System Pt 3 - Sense that Arduino via SNMP

Hardware:
    Arduino compatible Uno R3
    Arduino compatiable Ethernet Shield W5100
    15 PSI pressure sensor
    USB Wall Charger
    Network Switch
    The USB Charger was laying around and everything else was easily found on a eBay.
     

Libraries: (My copies of the oringals are at https://github.com/cajeeper/Arduino)
  • Agentuino - https://github.com/1sw/Agentuino
    • Requires
      • MemoryFree - https://github.com/maniacbug/MemoryFree
        Streaming - http://arduiniana.org/libraries/streaming/


My Arduino Sketch - A modification of the example Agentuino sketch:
/**  
 * SNMP Sensor Input Sketch v.2
 * Justin Bennett http://justin-bennett-msjc.blogspot.com/
 *
 *
 * Adapted from the Agentuino SNMP Example Sketch:
 *    Agentuino SNMP Agent Library Prototyping...  
 *  
 *    Copyright 2010 Eric C. Gionet <lavco_eg@hotmail.com>  
 *  
 */  
 #include <Streaming.h>     // Include the Streaming library  
 #include <Ethernet.h>     // Include the Ethernet library  
 #include <SPI.h>  
 #include <MemoryFree.h>  
 #include <Agentuino.h>  
 //#include <Flash.h>  
 //  
 //  
 #define DEBUG  
 //  
 static byte mac[] = { 0xAA, 0xAA, 0xBB, 0xBB, 0x00, 0x01 };  
 static byte ip[] = { 192, 168, 0, 10 };  
 static byte gateway[] = { 192, 168, 0, 1 };  
 static byte subnet[] = { 255, 255, 255, 0 };  
 //  
 //  
 // tkmib - linux mib browser  
 //  
 // RFC1213-MIB OIDs  
 // .iso (.1)  
 // .iso.org (.1.3)  
 // .iso.org.dod (.1.3.6)  
 // .iso.org.dod.internet (.1.3.6.1)  
 // .iso.org.dod.internet.mgmt (.1.3.6.1.2)  
 // .iso.org.dod.internet.mgmt.mib-2 (.1.3.6.1.2.1)  
 // .iso.org.dod.internet.mgmt.mib-2.system (.1.3.6.1.2.1.1)  
 // .iso.org.dod.internet.mgmt.mib-2.system.sysDescr (.1.3.6.1.2.1.1.1)  
 const static char sysDescr[] PROGMEM   = "1.3.6.1.2.1.1.1.0"; // read-only (DisplayString)  
 // .iso.org.dod.internet.mgmt.mib-2.system.sysObjectID (.1.3.6.1.2.1.1.2)  
 const static char sysObjectID[] PROGMEM  = "1.3.6.1.2.1.1.2.0"; // read-only (ObjectIdentifier)  
 // .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime (.1.3.6.1.2.1.1.3)  
 const static char sysUpTime[] PROGMEM   = "1.3.6.1.2.1.1.3.0"; // read-only (TimeTicks)  
 // .iso.org.dod.internet.mgmt.mib-2.system.sysContact (.1.3.6.1.2.1.1.4)  
 const static char sysContact[] PROGMEM  = "1.3.6.1.2.1.1.4.0"; // read-write (DisplayString)  
 // .iso.org.dod.internet.mgmt.mib-2.system.sysName (.1.3.6.1.2.1.1.5)  
 const static char sysName[] PROGMEM    = "1.3.6.1.2.1.1.5.0"; // read-write (DisplayString)  
 // .iso.org.dod.internet.mgmt.mib-2.system.sysLocation (.1.3.6.1.2.1.1.6)  
 const static char sysLocation[] PROGMEM  = "1.3.6.1.2.1.1.6.0"; // read-write (DisplayString)  
 // .iso.org.dod.internet.mgmt.mib-2.system.sysServices (.1.3.6.1.2.1.1.7)  
 const static char sysServices[] PROGMEM  = "1.3.6.1.2.1.1.7.0"; // read-only (Integer)  
 //  
 // Arduino defined OIDs  
 // .iso.org.dod.internet.private (.1.3.6.1.4)  
 // .iso.org.dod.internet.private.enterprises (.1.3.6.1.4.1)  
 // .iso.org.dod.internet.private.enterprises.arduino (.1.3.6.1.4.1.36582)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.0.0)  
 const static char RAWa0[] PROGMEM   = "1.3.6.1.4.1.36582.0.0"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.0.1)  
 const static char RAWa1[] PROGMEM   = "1.3.6.1.4.1.36582.0.1"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.0.2)  
 const static char RAWa2[] PROGMEM   = "1.3.6.1.4.1.36582.0.2"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.0.3)  
 const static char RAWa3[] PROGMEM   = "1.3.6.1.4.1.36582.0.3"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.0.4)  
 //const static char RAWa4[] PROGMEM   = "1.3.6.1.4.1.36582.0.4"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.0.5)  
 const static char RAWa5[] PROGMEM   = "1.3.6.1.4.1.36582.0.5"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.0)  
 //const static char RAWd0[] PROGMEM   = "1.3.6.1.4.1.36582.1.0"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.1)  
 //const static char RAWd1[] PROGMEM   = "1.3.6.1.4.1.36582.1.1"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.2)  
 const static char RAWd2[] PROGMEM   = "1.3.6.1.4.1.36582.1.2"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.3)  
 const static char RAWd3[] PROGMEM   = "1.3.6.1.4.1.36582.1.3"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.4)  
 const static char RAWd4[] PROGMEM   = "1.3.6.1.4.1.36582.1.4"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.5)  
 const static char RAWd5[] PROGMEM   = "1.3.6.1.4.1.36582.1.5"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.6)  
 const static char RAWd6[] PROGMEM   = "1.3.6.1.4.1.36582.1.6"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.7)  
 const static char RAWd7[] PROGMEM   = "1.3.6.1.4.1.36582.1.7"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.8)  
 const static char RAWd8[] PROGMEM   = "1.3.6.1.4.1.36582.1.8"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.9)  
 const static char RAWd9[] PROGMEM   = "1.3.6.1.4.1.36582.1.9"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.10)  
 //const static char RAWd10[] PROGMEM   = "1.3.6.1.4.1.36582.1.10"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.11)  
 //const static char RAWd11[] PROGMEM   = "1.3.6.1.4.1.36582.1.11"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.12)  
 //const static char RAWd12[] PROGMEM   = "1.3.6.1.4.1.36582.1.12"; // read-only (Integer)  
 // .iso.org.dod.internet.private.enterprises.arduino.RAW (.1.3.6.1.4.1.36582.1.13)  
 //const static char RAWd13[] PROGMEM   = "1.3.6.1.4.1.36582.1.13"; // read-only (Integer)  
 //  
 //  
 // RFC1213 local values  
 static char locDescr[]       = "Agentuino, a light-weight SNMP Agent."; // read-only (static)  
 static char locObjectID[]      = "1.3.6.1.3.2009.0";            // read-only (static)  
 static uint32_t locUpTime      = 0;                    // read-only (static)  
 static char locContact[20]     = "";              // should be stored/read from EEPROM - read/write (not done for simplicity)  
 static char locName[20]       = "Sensor";    // should be stored/read from EEPROM - read/write (not done for simplicity)  
 static char locLocation[20]     = "";            // should be stored/read from EEPROM - read/write (not done for simplicity)  
 static int32_t locServices     = 7;                    // read-only (static)  
 uint32_t prevMillis = millis();  
 char oid[SNMP_MAX_OID_LEN];  
 SNMP_API_STAT_CODES api_status;  
 SNMP_ERR_CODES status;  
 void pduReceived()  
 {  
  SNMP_PDU pdu;  
  //  
  #ifdef DEBUG  
   Serial << F("UDP Packet Received Start..") << F(" RAM:") << freeMemory() << endl;  
  #endif  
  //  
  api_status = Agentuino.requestPdu(&pdu);  
  //  
  if ( pdu.type == SNMP_PDU_GET || pdu.type == SNMP_PDU_GET_NEXT || pdu.type == SNMP_PDU_SET  
   && pdu.error == SNMP_ERR_NO_ERROR && api_status == SNMP_API_STAT_SUCCESS ) {  
   //  
   pdu.OID.toString(oid);  
   //  
   //Serial << "OID: " << oid << endl;  
   //  
   if ( strcmp_P(oid, sysDescr ) == 0 ) {  
    // handle sysDescr (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - locDescr  
     status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locDescr);  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("sysDescr...") << locDescr << F(" ") << pdu.VALUE.size << endl;  
    #endif  
   } else if ( strcmp_P(oid, sysUpTime ) == 0 ) {  
    // handle sysName (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - locUpTime  
     status = pdu.VALUE.encode(SNMP_SYNTAX_TIME_TICKS, locUpTime);  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("sysUpTime...") << locUpTime << F(" ") << pdu.VALUE.size << endl;  
    #endif  
   } else if ( strcmp_P(oid, sysName ) == 0 ) {  
    // handle sysName (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read/write  
     status = pdu.VALUE.decode(locName, strlen(locName));  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    } else {  
     // response packet from get-request - locName  
     status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locName);  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("sysName...") << locName << F(" ") << pdu.VALUE.size << endl;  
    #endif  
   } else if ( strcmp_P(oid, sysContact ) == 0 ) {  
    // handle sysContact (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read/write  
     status = pdu.VALUE.decode(locContact, strlen(locContact));  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    } else {  
     // response packet from get-request - locContact  
     status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locContact);  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("sysContact...") << locContact << F(" ") << pdu.VALUE.size << endl;  
    #endif  
   } else if ( strcmp_P(oid, sysLocation ) == 0 ) {  
    // handle sysLocation (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read/write  
     status = pdu.VALUE.decode(locLocation, strlen(locLocation));  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    } else {  
     // response packet from get-request - locLocation  
     status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locLocation);  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("sysLocation...") << locLocation << F(" ") << pdu.VALUE.size << endl;  
    #endif  
   } else if ( strcmp_P(oid, sysServices) == 0 ) {  
    // handle sysServices (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - locServices  
     status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locServices);  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("locServices...") << locServices << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWa0) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            rawReading = analogRead(A0);  // Range : 0..1024  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWa0...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
    } else if ( strcmp_P(oid, RAWa1) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            rawReading = analogRead(A1);  // Range : 0..1024  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAW...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
    } else if ( strcmp_P(oid, RAWa2) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            rawReading = analogRead(A2);  // Range : 0..1024  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWa2...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWa3) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            rawReading = analogRead(A3);  // Range : 0..1024  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWa3...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
 //     } else if ( strcmp_P(oid, RAWa4) == 0 ) {  
 //   int rawReading = 0;  
 //   // handle RAW (set/get) requests  
 //   if ( pdu.type == SNMP_PDU_SET ) {  
 //    // response packet from set-request - object is read-only  
 //    pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = SNMP_ERR_READ_ONLY;  
 //   } else {  
 //    // response packet from get-request - RAW  
 //           rawReading = analogRead(A4);  // Range : 0..1024  
 //           status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
 //           pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = status;  
 //   }  
 //   //  
 //   #ifdef DEBUG  
 //    Serial << F("RAWa4...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
 //   #endif  
      } else if ( strcmp_P(oid, RAWa5) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            rawReading = analogRead(A5);  // Range : 0..1024  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWa5...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
 //      } else if ( strcmp_P(oid, RAWd0) == 0 ) {  
 //   int rawReading = 0;  
 //   // handle RAW (set/get) requests  
 //   if ( pdu.type == SNMP_PDU_SET ) {  
 //    // response packet from set-request - object is read-only  
 //    pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = SNMP_ERR_READ_ONLY;  
 //   } else {  
 //    // response packet from get-request - RAW  
 //           if (digitalRead(0) == LOW) {  
 //            rawReading = 1; // Range : 0..1  
 //           }  
 //           status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
 //           pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = status;  
 //   }  
 //   //  
 //   #ifdef DEBUG  
 //    Serial << F("RAWd0...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
 //   #endif  
 //     } else if ( strcmp_P(oid, RAWd1) == 0 ) {  
 //   int rawReading = 0;  
 //   // handle RAW (set/get) requests  
 //   if ( pdu.type == SNMP_PDU_SET ) {  
 //    // response packet from set-request - object is read-only  
 //    pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = SNMP_ERR_READ_ONLY;  
 //   } else {  
 //    // response packet from get-request - RAW  
 //           if (digitalRead(1) == LOW) {  
 //            rawReading = 1; // Range : 0..1  
 //           }           status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
 //           pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = status;  
 //   }  
 //   //  
 //   #ifdef DEBUG  
 //    Serial << F("RAWd1...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
 //   #endif  
      } else if ( strcmp_P(oid, RAWd2) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(2) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd2...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWd3) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(3) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd3...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWd4) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(4) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd4...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWd5) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(5) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd5...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWd6) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(6) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd6...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWd7) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(7) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd7...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWd8) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(8) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd8...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
      } else if ( strcmp_P(oid, RAWd9) == 0 ) {  
    int rawReading = 0;  
    // handle RAW (set/get) requests  
    if ( pdu.type == SNMP_PDU_SET ) {  
     // response packet from set-request - object is read-only  
     pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = SNMP_ERR_READ_ONLY;  
    } else {  
     // response packet from get-request - RAW  
            if (digitalRead(9) == LOW) {  
             rawReading = 1; // Range : 0..1  
            }  
            status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
            pdu.type = SNMP_PDU_RESPONSE;  
     pdu.error = status;  
    }  
    //  
    #ifdef DEBUG  
     Serial << F("RAWd9...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
    #endif  
 //     } else if ( strcmp_P(oid, RAWd10) == 0 ) {  
 //   int rawReading = 0;  
 //   // handle RAW (set/get) requests  
 //   if ( pdu.type == SNMP_PDU_SET ) {  
 //    // response packet from set-request - object is read-only  
 //    pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = SNMP_ERR_READ_ONLY;  
 //   } else {  
 //    // response packet from get-request - RAW  
 //           if (digitalRead(10) == LOW) {  
 //            rawReading = 1; // Range : 0..1  
 //           }  
 //           status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
 //           pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = status;  
 //   }  
 //   //  
 //   #ifdef DEBUG  
 //    Serial << F("RAWd10...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
 //   #endif  
 //     } else if ( strcmp_P(oid, RAWd11) == 0 ) {  
 //   int rawReading = 0;  
 //   // handle RAW (set/get) requests  
 //   if ( pdu.type == SNMP_PDU_SET ) {  
 //    // response packet from set-request - object is read-only  
 //    pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = SNMP_ERR_READ_ONLY;  
 //   } else {  
 //    // response packet from get-request - RAW  
 //           if (digitalRead(11) == LOW) {  
 //            rawReading = 1; // Range : 0..1  
 //           }  
 //           status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
 //           pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = status;  
 //   }  
 //   //  
 //   #ifdef DEBUG  
 //    Serial << F("RAWd11...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
 //   #endif  
 //     } else if ( strcmp_P(oid, RAWd12) == 0 ) {  
 //   int rawReading = 0;  
 //   // handle RAW (set/get) requests  
 //   if ( pdu.type == SNMP_PDU_SET ) {  
 //    // response packet from set-request - object is read-only  
 //    pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = SNMP_ERR_READ_ONLY;  
 //   } else {  
 //    // response packet from get-request - RAW  
 //           if (digitalRead(12) == LOW) {  
 //            rawReading = 1; // Range : 0..1  
 //           }  
 //           status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
 //           pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = status;  
 //   }  
 //   //  
 //   #ifdef DEBUG  
 //    Serial << F("RAWd12...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
 //   #endif  
 //     } else if ( strcmp_P(oid, RAWd13) == 0 ) {  
 //   int rawReading = 0;  
 //   // handle RAW (set/get) requests  
 //   if ( pdu.type == SNMP_PDU_SET ) {  
 //    // response packet from set-request - object is read-only  
 //    pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = SNMP_ERR_READ_ONLY;  
 //   } else {  
 //    // response packet from get-request - RAW  
 //           if (digitalRead(13) == LOW) {  
 //            rawReading = 1; // Range : 0..1  
 //           }  
 //           status = pdu.VALUE.encode(SNMP_SYNTAX_INT, rawReading);  
 //           pdu.type = SNMP_PDU_RESPONSE;  
 //    pdu.error = status;  
 //   }  
 //   //  
 //   #ifdef DEBUG  
 //    Serial << F("RAWd13...") << rawReading << F(" ") << pdu.VALUE.size << endl;  
 //   #endif  
   } else {  
    // oid does not exist  
    //  
    // response packet - object not found  
    pdu.type = SNMP_PDU_RESPONSE;  
    pdu.error = SNMP_ERR_NO_SUCH_NAME;  
   }  
   //  
   Agentuino.responsePdu(&pdu);  
  }  
  //  
  Agentuino.freePdu(&pdu);  
  //  
  //Serial << "UDP Packet Received End.." << " RAM:" << freeMemory() << endl;  
 }  
 void setup()  
 {  
  Serial.begin(9600);  
  Ethernet.begin(mac, ip);  
  //  
  //  
  pinMode(A1, INPUT);  
  pinMode(A0, INPUT);  
  pinMode(A2, INPUT);  
  pinMode(A3, INPUT);  
 // pinMode(A4, INPUT);  
  pinMode(A5, INPUT);  
 // pinMode(0, INPUT);  
 // pinMode(1, INPUT);  
  pinMode(2, INPUT);  
  pinMode(3, INPUT);  
  pinMode(4, INPUT);  
  pinMode(5, INPUT);  
  pinMode(6, INPUT);  
  pinMode(7, INPUT);  
  pinMode(8, INPUT);  
  pinMode(9, INPUT);  
 // pinMode(10, INPUT);  
 // pinMode(11, INPUT);  
 // pinMode(12, INPUT);  
 // pinMode(13, INPUT);  
 //digitalWrite(0, HIGH);  
 //digitalWrite(1, HIGH);  
 digitalWrite(2, HIGH);  
 digitalWrite(3, HIGH);  
 digitalWrite(4, HIGH);  
 digitalWrite(5, HIGH);  
 digitalWrite(6, HIGH);  
 digitalWrite(7, HIGH);  
 digitalWrite(8, HIGH);  
 digitalWrite(9, HIGH);  
 //digitalWrite(10, HIGH);  
 //digitalWrite(11, HIGH);  
 //digitalWrite(12, HIGH);  
 //digitalWrite(13, HIGH);  
  api_status = Agentuino.begin();  
  if ( api_status == SNMP_API_STAT_SUCCESS ) {  
   //  
   Agentuino.onPduReceive(pduReceived);  
   //  
   delay(10);  
   //  
   Serial << F("SNMP Agent Initalized...") << endl;  
   //  
   return;  
  }  
  //  
  delay(10);  
  //  
  Serial << F("SNMP Agent Initalization Problem...") << status << endl;  
 }  
 void loop()  
 {  
  // listen/handle for incoming SNMP requests  
  Agentuino.listen();  
  //  
  // sysUpTime - The time (in hundredths of a second) since  
  // the network management portion of the system was last  
  // re-initialized.  
  if ( millis() - prevMillis > 1000 ) {  
   // increment previous milliseconds  
   prevMillis += 1000;  
   //  
   // increment up-time counter  
   locUpTime += 100;  
  }  
 }  
Formatted for web with http://codeformatter.blogspot.com/ 

With this sketch, the pin inputs I can read are:
Analog 0, 1, 2, 3, 5 - Values returned - integer 0 - 1024 (0 - 5V Input)
Digital 2, 3, 4, 5, 6, 7, 8, 9 - Values returned - integer 0 (Open to GND) or 1 (Closed to GND)

I'm only using analog pin 1 to read in my 15 PSI sensor. At first, I was doing all the math on the Arduino, but it made it less flexible, so I've moved all my math and formulas for water - Analog input to Volts, PSI to inch/feet of water, and height of water to gallons based on tank shape and size - into PowerShell.


To read the sensor, you apply 5V power and ground from the Arduino to it and measure the signal input as 0 - 1024 input.

I noticed the math wasn't working out when I checked the actual inches of water versus what my sensor was reporting. The biggest variable appears to be the input voltage from your power source. I have found some USB wall adapters vary as much as 4.55 - 4.98 VDC. So, be sure to take the actual reference voltage before finalizing your formulas on reading in from analog pins.


I'll share my PowerShell function's details - which makes this easy to adjust reference voltage input - in Part 4.