Pith - iot_sit_counter
iot_sit_counter/iot_sit_counter.ino [3.6 kb]
Modified: 00:51:04 57 026 (15 May 026)
16 Days Ago
// 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();
  }
}
Updates
Shim - Android 70.026.1
Wedge - Linux 68.026.1
Wedge - Android 68.026.1
Taper - Linux 64.026.1
Ayh Extension - Chrome 63.026.1
Dev
TVShow (227) 'CSA'
TVShow (228) 'APT'
TVProgram (83) 'BXT'
Miter Update(s)
Shim (Dictation)

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)