1. NodeMCU ESP-12E
2. (2) LEDs
3. (4) 1K Resistor
4. Push Button
5. Slide Switch
6. 10K Pot
- // IoT Sit Counter
- // pkvi
- // 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();
- }
- }