// IoT Sit Counter
// vgmlr
// NodeMCU ESP-12E 1.0
#include "ESP8266WiFi.h"
// WIFI Network Access
const char* ssid = "XXXXXX";
const char* password = "XXXXXXX";
WiFiServer server(80);
// ThingSpeak Access
char thingSpeakAddress[] = "api.thingspeak.com";
String APIKey = "XXXXXXXXXXX"; // API
const int updateThingSpeakInterval = 10 * 1000; // Interval
long lastConnectionTime = 0;
boolean lastConnected = false;
WiFiClient client;
// LEDs
int activeled = 13;
int wifiled = 12;
// Sensor
int sensor = A0;
int ssr = 0;
int sensorstart = 0;
int senres = 0;
int sensorstate = 0;
// Button
int button = 14;
int buttstate;
// Stats
int sitdown = 0;
int pretime = 0;
float dattime;
float runpert;
// States
int mainstate = 0;
void setup() {
Serial.begin(9600);
pinMode(button, INPUT);
pinMode(activeled, OUTPUT);
pinMode(wifiled, OUTPUT);
digitalWrite(activeled, LOW);
digitalWrite(wifiled, LOW);
calibrate();
}
void loop() {
digitalWrite(activeled, HIGH);
// WIFI Button Pressed?
buttstate = digitalRead(button);
// WIFI Yes or No?
if (buttstate == HIGH) {
Serial.println("Connecting");
digitalWrite(wifiled, HIGH);
// Load WiFi
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, password);
delay(10000);
}
Serial.println("Connected");
server.begin();
// Calculate Minutes Seated
dattime = pretime / 60.0;
// Truncate
dattime = (int) dattime;
// Calculate Percent Seated
runpert = millis();
// Convert to Seconds
runpert = runpert / 1000.0;
// Convert to Minutes
runpert = runpert / 60.0;
// Convert to Percent
runpert = dattime / runpert;
// Truncate
runpert = (int) runpert;
// Update ThingSpeak
String sitfinal = String(sitdown, DEC);
String timefinal = String(dattime, DEC);
String runfinal = String(runpert, DEC);
updateThingSpeak("field1=" + sitfinal + "&field2=" +
timefinal + "&field3=" + runfinal);
delay(3000);
// Reset Data
sitdown = 0;
pretime = 0;
dattime = 0;
runpert = 0;
} else {
// No WIFI
digitalWrite(wifiled, LOW);
// Read Sensor
sensorstate = analogRead(sensor);
// Sitting?
if (sensorstate > sensorstart) {
// Delay For 5 Seconds To Confirm Sit
if (mainstate == 0) {
delay(5000);
mainstate = 1;
goto escape;
} else if (mainstate == 1) {
// Add A Sit
sitdown = sitdown + 1;
// Run While Sitting To Track Time
// 1 Second Per Loop
while (sensorstate > sensorstart) {
sensorstate = analogRead(sensor);
pretime = pretime + 1;
delay(1000);
}
// Reset State
mainstate = 0;
}
}
}
delay(1000);
digitalWrite(activeled, LOW);
delay(1000);
escape:
}
// Calibrate While Standing
void calibrate() {
for (int x = 0; x < 10; x++) {
ssr = analogRead(sensor);
sensorstart = sensorstart + ssr;
delay(100);
digitalWrite(activeled, HIGH);
}
// sensorstart Equals Average Standing Value
sensorstart = sensorstart / 10;
// Add Leniency
sensorstart = sensorstart + 200;
digitalWrite(activeled, LOW);
}
// ThingSpeak
void updateThingSpeak(String tsData) {
if (client.connect(thingSpeakAddress, 80)) {
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + APIKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
lastConnectionTime = millis();
}
}