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(" ");
}
Log in or sign up for Devpost to join the conversation.