Inspiration

What it does

How I built it

Challenges I ran into

Accomplishments that I'm proud of

What I learned

What's next for Washroom Sensor

include

include

include

//Pins and Threshold

define TRIGGER1 14

define TRIGGER2 13

define ECHO1 12

define ECHO2 15

define THRESHOLD 30

//Wifi Variables const char* ssid = "Tryouts"; const char* password = "turnipin";

define ORG "tzivom" // "quickstart" or use your organisation

define DEVICE_ID "test2"

define DEVICE_TYPE "huzzah" // your device type or not used for "quickstart"

define TOKEN "T7ACHIKYO_nSBdf@1C" // your device token or not used for "quickstart"

char server[] = ORG ".messaging.internetofthings.ibmcloud.com"; char topic[] = "iot-2/evt/status/fmt/json"; char authMethod[] = "use-token-auth"; char token[] = TOKEN; char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID; const int analog = A0;

//Initialize Hardware WiFiClientSecure wifiClient; PubSubClient client(server, 8883, wifiClient); LiquidCrystal_I2C lcd(0x27, 2, 16);

//Measurement Variables char dist1[10000] = ""; char dist2[10000] = ""; long initDist1; long initDist2; int ping1 = 0; int ping2 = 0; long time1; long time2; long timeDiff; long counter; long currentTime; int currentNumPpl = 0; int totalNumPpl = 0;

long sensorPing(int TRIGGER, int ECHO){ long duration;

digitalWrite(TRIGGER, LOW); delayMicroseconds(2); digitalWrite(TRIGGER, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER, LOW); duration = pulseIn(ECHO, HIGH); return (duration/2) / 29.1; }

void setup() { //Initialize Pins Serial.begin(115200); pinMode(TRIGGER1, OUTPUT); pinMode(ECHO1, INPUT); pinMode(TRIGGER2, OUTPUT); pinMode(ECHO2, INPUT); pinMode(BUILTIN_LED, OUTPUT);

//Initialize LCD lcd.begin(); lcd.backlight();

//Measure Initial Distances delay(100); initDist1 = sensorPing(TRIGGER1, ECHO1); delay(100); initDist2 = sensorPing(TRIGGER2, ECHO2);

//Print Initial Distances Serial.print("Initial Distance 1: "); Serial.print(initDist1); Serial.print("\nInitial Distance 2: "); Serial.print(initDist2);

//Initialize Wifi Serial.print("\nConnecting to "); Serial.print(ssid); if (strcmp (WiFi.SSID().c_str(), ssid) != 0) { WiFi.begin(ssid, password); } while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println(""); Serial.print("WiFi connected, IP address: "); Serial.println(WiFi.localIP()); Serial.println("View the published data on Watson at: "); if (ORG == "quickstart") { Serial.println("https://quickstart.internetofthings.ibmcloud.com/#/device/" DEVICE_ID "/sensor/"); } else { Serial.println("https://" ORG ".internetofthings.ibmcloud.com/dashboard/#/devices/browse/drilldown/" DEVICE_TYPE "/" DEVICE_ID); } counter = millis(); }

void loop() { //Measure Current Time currentTime = millis();

//Measurement Distances long distance1, distance2;

//Sensor 1 if(ping1 == 0){ //Measure Distance 1 distance1 = sensorPing(TRIGGER1, ECHO1);

//If Pinged
if(distance1 < (initDist1 - THRESHOLD)){
  //Get Current Time
  time1 = millis();

  //Print Current Time
  Serial.print("\nTime1: ");
  Serial.print(time1);
  Serial.print("\n");

  //Set Ping
  ping1 = 1;

  //Delay for Measurement 2
  delay(10);
}

//While Pinged
while(ping1 == 1){
  //Measure Distance 2
  distance2 = sensorPing(TRIGGER2, ECHO2);

  //Check Timer
  currentTime = millis();

  //If More than 1 Second
  if((currentTime - time1) > 1000){
    ping1 = 0;
    break;
  }

  //If Pinged
  if(distance2 < (initDist2 - THRESHOLD)){
    //Get Current Time
    time2 = millis();

    //Print Current Time
    Serial.print("\nTime2: ");
    Serial.print(time2);
    Serial.print("\n");

    //Set Ping
    ping2 = 1;
  }

  //If Both Pinged
  if(ping1 == 1 && ping2 == 1){
    Serial.print("OUT\n");
    currentNumPpl--;
    if(currentNumPpl < 0){
      currentNumPpl = 0;
    }

    ping1 = 0;
    ping2 = 0;
    delay(1000);
  }

}

} delay(50);

//Sensor 2 if(ping2 == 0){ //Measure Distance 2 distance2 = sensorPing(TRIGGER2, ECHO2);

//If Pinged
if(distance2 < (initDist2 - THRESHOLD)){
  //Get Current Time
  time2 = millis();

  //Print Current Time
  Serial.print("\nTime2: ");
  Serial.print(time2);
  Serial.print("\n");

  //Set Ping
  ping2 = 1;

  //Delay for Measurement 1
  delay(10);
}

//While Pinged
while(ping2 == 1){
  //Measure Distance 1
  distance1 = sensorPing(TRIGGER1, ECHO1);

  //Check Timer
  currentTime = millis();

  //If More than 1 Second
  if((currentTime - time2) > 1000){
    ping2 = 0;
    break;
  }

  //If Pinged
  if(distance1 < (initDist1 - THRESHOLD)){
    //Get Current Time
    time1 = millis();

    //Print Current Time
    Serial.print("\nTime1: ");
    Serial.print(time1);
    Serial.print("\n");

    //Set Ping
    ping1 = 1;
  }

  //If Both Pinged
  if(ping1 == 1 && ping2 == 1){
    Serial.print("IN\n");
    currentNumPpl++;
    totalNumPpl++;

    ping1 = 0;
    ping2 = 0;
    delay(1000);
  }

}

} delay(50);

//Upload Data if(currentTime - counter > 10000){ if (!!!client.connected()) { Serial.print("Reconnecting client to "); Serial.println(server); while ( ! (ORG == "quickstart" ? client.connect(clientId) : client.connect(clientId, authMethod, token))) { Serial.print("."); delay(500); } Serial.println(); } String payload = "{\"d\":{\"Name\":\"" DEVICE_ID "\""; payload += ",\"raw data\":"; payload += analogRead (analog); payload += ",\"current people\":"; payload += currentNumPpl; payload += ",\"total people\":"; payload += totalNumPpl; payload += "}}";

Serial.print("Sending payload: "); Serial.println(payload);

if (client.publish(topic, (char*) payload.c_str())) {
  Serial.println("Publish ok");
} else {
  Serial.println("Publish failed");
}
counter = millis();

}

//LCD Output lcd.setCursor(0, 0); //Print Current People lcd.print("Crnt Ppl: "); lcd.print(currentNumPpl); lcd.print(" "); //Print Total People lcd.setCursor(0, 1); lcd.print("Ttl Ppl: "); lcd.print(totalNumPpl); lcd.print(" ");

}

Share this project:

Updates